<?php

/**
 * Created by PhpStorm.
 * User: 孙武
 * Date: 2017/8/27
 * Time: 20:40
 */
class WeChat
{
    private $_appid;
    private $_appsecret;
    private $_accessTokenLifeTime = 7200; //accessToken有效时间
    private $_access_token;

    public function __construct($appid, $appsecret)
    {
        $this->_appid = $appid;
        $this->_appsecret = $appsecret;
        $this->_access_token = $this->getAccessToken();
    }

    /**
     * 响应微信服务器请求
     */
    public function doResponse()
    {
        /*
         * 处理流程
         * 1 接受微信服务器信息
         * 2 识别信息类别
         * 3 响应信息
         */

        $recieveInfo = $GLOBALS['HTTP_RAW_POST_DATA'];
        $xmlObj = new SimpleXMLElement($recieveInfo);
        $MsgType = $xmlObj->MsgType;
        switch ($MsgType) {
            case 'text'://用户发送消息
                $this->_doText($xmlObj);
                break;
            case 'event'://事件处理
                $this->_doEvent($xmlObj);
                break;
            case 'image'://图片
                $this->_doImg($xmlObj);
                break;
            case 'voice'://语音消息

                break;
            case 'video'://视频消息

                break;
            case  'shortvideo'://小视频消息

                break;
            case 'location'://地理位置消息

                break;
            case 'link'://链接消息

                break;
        }

    }

    /**
     *图文消息模板
     * @var string
     */
    private $imgtextTemplate = '<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[%s]]></MsgType>
<ArticleCount>%s</ArticleCount>
<Articles>
    %s
</Articles>
</xml>';

    /**
     * item模板
     * @var string
     */
    private $itemTemplate = '<item>
<Title><![CDATA[%s]]></Title>
<Description><![CDATA[%s]]></Description>
<PicUrl><![CDATA[%s]]></PicUrl>
<Url><![CDATA[%s]]></Url>
</item>';

    /**
     * 回复语音消息模板
     * @var string
     */
    private $voiceTemplate = '<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[%s]]></MsgType>
<Voice>
<MediaId><![CDATA[%s]]></MediaId>
</Voice>
</xml>';

    /**
     * 回复text消息的模板
     * @var string
     */
    private $textTemplate = '<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[%s]]></MsgType>
<Content><![CDATA[%s]]></Content>
</xml>';

    /**
     * 回复图片消息模板
     * @var string
     */
    private $imgTemplate = '<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[%s]]></MsgType>
<Image>
<MediaId><![CDATA[%s]]></MediaId>
</Image>
</xml>';

    /**
     * 音乐消息模板
     * @var string
     */
    private $_musicTemplate = '<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[%s]]></MsgType>
<Music>
<Title><![CDATA[%s]]></Title>
<Description><![CDATA[%s]]></Description>
<MusicUrl><![CDATA[%s]]></MusicUrl>
<HQMusicUrl><![CDATA[%s]]></HQMusicUrl>
<ThumbMediaId><![CDATA[%s]]></ThumbMediaId>
</Music>
</xml>';

    /**
     * 视频模板
     * @var string
     */
    private $_videoTemplate='<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[%s]]></MsgType>
<Video>
<MediaId><![CDATA[%s]]></MediaId>
<Title><![CDATA[%s]]></Title>
<Description><![CDATA[%s]]></Description>
</Video> 
</xml>';

    /**
     * 获取accessToken
     * @param string $accessTokenSavePath accessToken保存地址
     * @return bool|string 成功返回accessToken,失败返回false
     */
    public function getAccessToken($accessTokenSavePath = './AccessToken')
    {
        //文件保存access_token信息
        $accessToken = '';
        if (time() - filemtime($accessTokenSavePath) <= $this->_accessTokenLifeTime) {
            $accessToken = file_get_contents($accessTokenSavePath);
        } else {
            $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$this->_appid}&secret={$this->_appsecret}";
            $accessTokenJson = $this->_curlGet($url);
            $accessToken = $accessTokenJson->access_token;
            file_put_contents($accessTokenSavePath, $accessToken);
        }
        if ($accessToken) {
            return $accessToken;
        }
        return false;
    }

    /**
     * 获取二维码所需的ticket
     * @param int $type 二维码类型 0-临时id 1-临时字符串 2-永久id 3永久字符串
     * @param $sence 0,2:穿入int型数据 1,3:传入字符串
     * @param int $lifeTime 二维码的有效时间,如果是零时的,则需要传入;永久的传入不传入都不影响
     * @return bool|string 成功返回ticket,失败返回false
     */
    public function getTicket($type, $sence, $lifeTime = 2592000)
    {
        //获取access_token
        $accessToken = $this->getAccessToken();

        //$QRTypes 0-临时id 1-临时字符串 2-永久id 3永久字符串
        $QRTypes = array(
            'QR_SCENE',//临时id
            'QR_STR_SCENE',//零时字符串
            'QR_LIMIT_SCENE',//永久id
            'QR_LIMIT_STR_SCENE'//永久字符串
        );

        $url = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=$accessToken";
        $date = array();
        switch ($type) {
            case '0':
                $date['expire_seconds'] = $lifeTime;
                $date['action_name'] = $QRTypes[$type];
                $date['action_info']['scene']['scene_id'] = $sence;

                break;
            case '1':
                $date['expire_seconds'] = $lifeTime;
                $date['action_name'] = $QRTypes[$type];
                $date['action_info']['scene']['scene_str'] = $sence;
                break;
            case '2':
                $date['action_name'] = $QRTypes[$type];
                $date['action_info']['scene']['scene_id'] = $sence;
                break;
            case '3':
                $date['action_name'] = $QRTypes[$type];
                $date['action_info']['scene']['scene_str'] = $sence;
                break;
        }

        $res = $this->_curlPost($url, $date);
        $ticket = $res->ticket;
        return $ticket;
        /*
         * object(stdClass)#2 (3) { ["ticket"]=> string(96) "gQFn8DwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxLmNvbS9xLzAyWXVrSHR0Tm1lYWkxVGZfYmhwMUkAAgTP8qNZAwQAjScA"
         * ["expire_seconds"]=> int(2592000)
         * ["url"]=> string(45) "http://weixin.qq.com/q/02YukHttNmeai1Tf_bhp1I" }
         */
        //零时二维码
        /*URL: https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=TOKENPOST数据格式：json
        POST数据例子：{"expire_seconds": 604800, "action_name": "QR_SCENE", "action_info": {"scene": {"scene_id": 123}}}*/

        //永久二维码
        /* URL: https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=TOKENPOST数据格式：json
         POST数据例子：{"action_name": "QR_LIMIT_SCENE", "action_info": {"scene": {"scene_id": 123}}}*/
    }

    /**
     * 获取二维码
     * @param int $type 二维码类型
     * @param int|string $sence 场景值
     * @param string $fileName 文件保存名称 如果给定,则输出为图像,如果不给定,则输出在网页
     * @param int $lifetime
     */
    public function getQR($type, $sence, $fileName = '', $lifetime = 2592000)
    {
        $ticket = $this->getTicket($type, $sence, $lifetime);
        $ticket = urlencode($ticket);
        $url = "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=$ticket";


        $curl = curl_init($url);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        $curlRes = curl_exec($curl);
        curl_close($curl);


        if (empty($fileName)) {
            header('Content-Type: image/jpeg');
            echo $curlRes;
        } else {
            $fileName = $fileName . '.jpg';
            if (file_put_contents($fileName, $curlRes)) {
                echo $fileName . "保存成功";
            }
        }
    }

    /**
     * 检查签名是否合法
     * @param string $token 用户自定义token
     * @return bool|signature 成功是返回signature,失败是返回false
     */
    public function checkSignature($token)
    {
        //处理信息
        /*
         * 1）将token、timestamp、nonce三个参数进行字典序排序
         * 2）将三个参数字符串拼接成一个字符串进行sha1加密
         * 3）开发者获得加密后的字符串可与signature对比，标识该请求来源于微信
         * */
        $signature = $_GET['signature'];
        $timestamp = $_GET['timestamp'];
        $nonce = $_GET['nonce'];
        $echostr = $_GET['echostr'];

        //排序处理
        $targetArr = array($token, $timestamp, $nonce);
        sort($targetArr, SORT_STRING);
        $arrStr = implode($targetArr);
        $targetStr = sha1($arrStr);

        //判断
        if ($targetStr == $signature) {
            return $echostr;
        }
        return false;
    }

    /**
     * 响应图片信息
     * @param object $xmlObj 微信服务器发来的xml对象
     */
    private function _doImg($xmlObj)
    {
        /*  $xmlObj信息
            ToUserName	开发者微信号
            FromUserName	发送方帐号（一个OpenID）
            CreateTime	消息创建时间 （整型）
            MsgType	image
            PicUrl	图片链接（由系统生成）
            MediaId	图片消息媒体id，可以调用多媒体文件下载接口拉取数据。
            MsgId	消息id，64位整型
        */

        /*  模板信息
         *  ToUserName	是	接收方帐号（收到的OpenID）
            FromUserName	是	开发者微信号
            CreateTime	是	消息创建时间 （整型）
            MsgType	是	image
            MediaId	是
            通过素材管理中的接口上传多媒体文件，得到的id。
         */

        $responseImg = sprintf(
            $this->imgTemplate,
            $xmlObj->FromUserName,
            $xmlObj->ToUserName,
            time(),
            'image',
            $xmlObj->MediaId
        );

        echo $responseImg;
    }

    /**
     * 响应文本信息
     * @param object $xmlObj 微信服务器发来的xml对象
     */
    private function _doText($xmlObj)
    {
        //原始数据
        /* $xmlObj信息
         * ToUserName	开发者微信号
            FromUserName	发送方帐号（一个OpenID）
            CreateTime	消息创建时间 （整型）
            MsgType	text
            Content	文本消息内容
            MsgId	消息id，64位整型
         *
         */

        /* $textTemplate信息
         *  ToUserName	是	接收方帐号（收到的OpenID）
            FromUserName	是	开发者微信号
            CreateTime	是	消息创建时间 （整型）
            MsgType	是	text
            Content	是	回复的消息内容（换行：在content中能够换行，微信客户端就支持换行显示）
         */


        $to = $xmlObj->ToUserName;
        $from = $xmlObj->FromUserName;


//        $mediaId = $this->getAMediaId();
//        $this->_sendImg($from, $to, $mediaId);
//
//
//        $news = $this->getNews();
//        $this->_sendNews($from,$to,$news);

//        $this->_sendVoice($from,$to,'fITAoO1PU2Iy2rxLeBp0SJ5CI8T0BevUQaMoWcbW8im_s6qIA67ZseiYaSWfc5oa');


         $this->_sendText($from,$to,'我是文本接口');
    }

    /**
     * 根据用户发来的信息自动生成回复信息
     * @param object $xmlObj 微信服务器发来的xml对象
     * @return string 自动生成的text信息
     */
    private function _autoGetResponseText($xmlObj)
    {
        $userText = $xmlObj->Content;//用户发送的信息
        $responseText = '';
        switch ($userText) {
            case '孙武':
                $responseText = '孙武是个小宝宝';
                break;
            case  '刘炳楠':
                $responseText = '刘炳楠是个大宝宝';
                break;
            default :
                $responseText = $userText;
        }
        return $responseText;
    }

    /**
     * 响应事件信息
     * @param object $xmlObj 微信服务器发来的xml对象
     */
    private function _doEvent($xmlObj)
    {
        $event = $xmlObj->Event;//获取事件类型
        $userEvent = $xmlObj->EventKey;
//        $this->_responseText($xmlObj->FromUserName, $xmlObj->ToUserName, $userEvent);
//        $this->_sendTex
        /*<xml>
                <ToUserName><![CDATA[toUser]]></ToUserName>
        <FromUserName><![CDATA[FromUser]]></FromUserName>
        <CreateTime>123456789</CreateTime>
        <MsgType><![CDATA[event]]></MsgType>
        <Event><![CDATA[SCAN]]></Event>
        <EventKey><![CDATA[SCENE_VALUE]]></EventKey>
        <Ticket><![CDATA[TICKET]]></Ticket>
        </xml>

        */

        $to = $xmlObj->ToUserName;
        $from = $xmlObj->FromUserName;
        //TODO 自定义的回调API


        $userOpenId=$xmlObj->FromUserName;
        $eventKey=$xmlObj->EventKey;
        //根据用户是关注还是关注时候邀请获取id

        if($event == 'subscribe'){
            //关注处理字符串
            $eventKey=substr($eventKey,8);
        }


        $api="http://www.gzcjdx.cn/WeChat/Bus/index.php/Home/Api/shareApi/usrId/$eventKey/scanPerson/$userOpenId";
        switch ($event) {
            case "subscribe":$this->_sendText($from,$to,$eventKey);break;
            case "SCAN":Curl::doGet($api);$this->_sendText($from,$to,"对方已成功邀请你,当你购票之后,对方将会收到红包");break;
        }
    }

    /**
     * 将text信息返回给微信服务器
     * @param string $content 需要返回的文本信息
     */
    private function _responseText($from, $to, $content)
    {
        //拼装数据信息
        $sendMSG = sprintf($this->textTemplate,
            $from,
            $to,
            time(),
            'text',
            $content);

        //回应微信服务器
        echo $sendMSG;
    }

    /**
     * 回复图文信息
     * @param $from
     * @param $to
     */
    private function _responseImgText($from, $to)
    {
        /*
         * ToUserName	是	接收方帐号（收到的OpenID）
            FromUserName	是	开发者微信号
            CreateTime	是	消息创建时间 （整型）
            MsgType	是	news
            ArticleCount	是	图文消息个数，限制为8条以内
            Articles	是	多条图文消息信息，默认第一个item为大图,注意，如果图文数超过8，则将会无响应
            Title	是	图文消息标题
            Description	是	图文消息描述
            PicUrl	是	图片链接，支持JPG、PNG格式，较好的效果为大图360*200，小图200*200
            Url	是	点击图文消息跳转链接
         */
        $Title1 = '爆炸新闻:孙武会开发微信公众号了,暂时借用百度图片吧';
        $Description1 = '额,挺好玩的';
        $PicUrl1 = 'https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo/bd_logo1_31bdc765.png';
        $Url1 = 'https://www.baidu.com/';
        $item1 = sprintf($this->itemTemplate, $Title1, $Description1, $PicUrl1, $Url1);


        $Title2 = '有趣有趣,嘻嘻哈哈';
        $Description2 = '哈哈哈';
        $PicUrl2 = 'https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo/bd_logo1_31bdc765.png';
        $Url2 = 'https://www.baidu.com/';
        $item2 = sprintf($this->itemTemplate, $Title2, $Description2, $PicUrl2, $Url2);
        $item3 = $item2;
        $items = $item1 . $item2 . $item3;
        $responseImgText = sprintf($this->imgtextTemplate,
            $to,
            $from,
            time(),
            'news',
            '3',
            $items
        );
        echo $responseImgText;

    }

    /**
     * curl发送get消息
     * @param string $url url地址
     * @return bool|mixed 成功返回json对象,失败返回false
     */
    public function _curlGet($url)
    {
        $curl = curl_init($url);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        $curlRes = curl_exec($curl);
        curl_close($curl);

        if ($curlRes) {
            return json_decode($curlRes);
        }
        return false;
    }

    /**
     * curl发送post数据
     * @param string $url 需要发送的url
     * @param array $data 需要发送的数据数组
     * @param bool $jsonCode 是否需要json编码
     * @return bool|mixed 成功返回json对象,失败返回false
     */
    public function _curlPost($url, $data, $jsonCode = ture)
    {
        if ($jsonCode) {
            $data = json_encode($data);//curl传送数据需要json_encode
        }
        $curl = curl_init($url);
        curl_setopt($curl, CURLOPT_SAFE_UPLOAD, false);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_HEADER, false);
        curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
        $curlRes = curl_exec($curl);
        curl_close($curl);

        if ($curlRes) {
            return json_decode($curlRes);
        }
        return false;
    }



    /**
     * 上传临时素材
     * @param string $file 文件的名(包含路径)
     * @return string|bool 成功返回media_id,失败返回false
     */
    public function uploadTempMedia($file)
    {
        //获取文件后缀
        $suffix = $this->getFileSuffixByFileName($file);
        $suffix = strtolower($suffix);
        $type = '';

        //文档类型说明
        /*
         * 图片（image）: 2M，支持PNG\JPEG\JPG\GIF格式
            语音（voice）：2M，播放长度不超过60s，支持AMR\MP3格式
            视频（video）：10MB，支持MP4格式
            缩略图（thumb）：64KB，支持JPG格式
        */


        //获取自动识别文件类型
        //图片格式
        $image = array('png', 'jpeg', 'jpg', 'gif');
        if (in_array($suffix, $image)) {
            $type = 'image';
        }

        //音乐格式
        $voice = array('amr', 'mp3');
        if (in_array($suffix, $voice)) {
            $type = 'voice';
        }

        //视频格式
        $video = array('mp4');
        if (in_array($suffix, $video)) {
            $type = 'video';
        }

        // 缩略图（
        $thumb = array('mp4');
        if (in_array($suffix, $thumb)) {
            $type = 'thumb';
        }


        //接口说明
        /*
         * http请求方式：POST/FORM，使用https
            https://api.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE
            调用示例（使用curl命令，用FORM表单方式上传一个多媒体文件）：
            curl -F media=@test.jpg "https://api.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE"
        */

        $url = "https://api.weixin.qq.com/cgi-bin/media/upload?access_token={$this->_access_token}&type=$type";
        $postDate['media'] = '@' . $file;
        $result = $this->_curlPost($url, $postDate, false);//上传文件域的数组不需要json_encode
        if ($result->media_id) {
            return $result->media_id;
        }
        return false;


    }

    /**
     * 根据文件名获取文件后缀
     * @param string $file 文件名
     */
    private function getFileSuffixByFileName($file)
    {
        //strrpos — 计算指定字符串在目标字符串中最后一次出现的位置
        $needle = strrpos($file, '.');
        //substr — 返回字符串的子串
        return substr($file, $needle + 1);
    }


    /*******菜单管理*************************************************/

    /**
     * 添加自定义菜单
     * @param json $menu 菜单json信息
     */
    public function createMenu($menu)
    {
        //模板信息
        /*
         * {
    "button": [
        {
            "name": "扫码",
            "sub_button": [
                {
                    "type": "scancode_waitmsg",
                    "name": "扫码带提示",
                    "key": "rselfmenu_0_0",
                    "sub_button": [ ]
                },
                {
                    "type": "scancode_push",
                    "name": "扫码推事件",
                    "key": "rselfmenu_0_1",
                    "sub_button": [ ]
                }
            ]
        },
        {
            "name": "发图",
            "sub_button": [
                {
                    "type": "pic_sysphoto",
                    "name": "系统拍照发图",
                    "key": "rselfmenu_1_0",
                   "sub_button": [ ]
                 },
                {
                    "type": "pic_photo_or_album",
                    "name": "拍照或者相册发图",
                    "key": "rselfmenu_1_1",
                    "sub_button": [ ]
                },
                {
                    "type": "pic_weixin",
                    "name": "微信相册发图",
                    "key": "rselfmenu_1_2",
                    "sub_button": [ ]
                }
            ]
        },
        {
            "name": "发送位置",
            "type": "location_select",
            "key": "rselfmenu_2_0"
        },
        {
           "type": "media_id",
           "name": "图片",
           "media_id": "MEDIA_ID1"
        },
        {
           "type": "view_limited",
           "name": "图文消息",
           "media_id": "MEDIA_ID2"
        }
    ]
}
         */
//        $menu=json_encode($menu);
        $accessToken = $this->getAccessToken();
        $url = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=$accessToken";
        $res = $this->_curlPost($url, $menu, false);
        var_dump($res);
        if($res->errcode==0) return true;
        return false;
    }
    
    /**
     * 查询菜单
     * @return bool|mixed 成功返回json对象,失败返回false
     */
    public function getMenu()
    {
        // http请求方式：GET
        //https://api.weixin.qq.com/cgi-bin/menu/get?access_token=ACCESS_TOKEN
        $url="https://api.weixin.qq.com/cgi-bin/menu/get?access_token=$this->_access_token";
        if($res=$this->_curlGet($url)){
            return  $res;
        }
        return false;
    }

    /**
     * 删除菜单
     * @return bool 成功返回true,失败返回false
     */
    public function delMenu()
    {
        $url="https://api.weixin.qq.com/cgi-bin/menu/delete?access_token=$this->_access_token";
        $res=$this->_curlGet($url);
        if($res->errcode == 0) return true;
        return false;
    }
    

    /*8888888    消息发送区域      88888888888888888888888888888888888*/


    
    /**
     * 发送文本消息
     * @param string $from 发送者账号
     * @param string $to 接受这账号
     * @param string $text 需要发送的文本
     */
    private function _sendText($from, $to, $text)
    {
        //拼装数据信息
        $sendMSG = sprintf($this->textTemplate,
            $from,
            $to,
            time(),
            'text',
            $text
        );

        //回应微信服务器
        die($sendMSG);
    }

    /**
     * 发送图片消息
     * @param string $from 发送者账号
     * @param string $to 接受这账号
     * @param string $mediaId 图片的media_id
     */
    private function _sendImg($from, $to, $mediaId)
    {
        $responseImg = sprintf(
            $this->imgTemplate,
            $to,
            $from,
            time(),
            'image',
            $mediaId
        );

        echo $responseImg;
    }

    /**
     * 发送语言信息
     * @param string $from 发送者账号
     * @param string $to 接受这账号
     * @param string $mediaId 语言media_id
     */
    private function _sendVoice($from, $to, $mediaId)
    {
        $responseImg = sprintf(
            $this->voiceTemplate,
            $to,
            $from,
            time(),
            'voice',
            $mediaId
        );

        echo $responseImg;
    }

    /**
     * 发送视频信息
     * @param string $from 发送者账号
     * @param string $to 接受这账号
     * @param string $mediaId 通过素材管理中的接口上传多媒体文件，得到的id
     * @param string $title 视频消息的标题
     * @param string $desc 视频消息的描述
     */
    private function _sendVideo($from, $to, $mediaId,$title='',$desc='')
    {
        $responseImg = sprintf(
            $this->_videoTemplate,
            $to,
            $from,
            time(),
            'video',
            $mediaId,
            $title,
            $desc
        );

        echo $responseImg;
    }

    /**
     * 发送音乐信息
     * @param string $from 发送者账号
     * @param string $to 接受这账号
     * @param string $ThumbMediaId 缩略图的媒体id
     * @param string $title 音乐标题
     * @param string $desc 音乐描述
     * @param string $url 音乐链接
     * @param string $HQurl 高质量音乐链接，WIFI环境优先使用该链接播放音乐
     */
    private function _sendMusic($from, $to, $thumbMediaId, $title = '', $desc = '', $url = '', $HQurl = '')
    {
        $responseImg = sprintf(
            $this->_musicTemplate,
            $to,
            $from,
            time(),
            'music',
            $title,
            $desc,
            $HQurl,
            $url,
            $thumbMediaId
        );

        echo $responseImg;
    }

    /**
     * 发送图文消息
     * @param string $from 发送者账号
     * @param string $to 接受这账号
     * @param array $items 图文消息二维数组包含:
     */
    private function _sendNews($from, $to, $items = array())
    {
        /*
         * ToUserName	是	接收方帐号（收到的OpenID）
            FromUserName	是	开发者微信号
            CreateTime	是	消息创建时间 （整型）
            MsgType	是	news
            ArticleCount	是	图文消息个数，限制为8条以内
            Articles	是	多条图文消息信息，默认第一个item为大图,注意，如果图文数超过8，则将会无响应
            Title	是	图文消息标题
            Description	是	图文消息描述
            PicUrl	是	图片链接，支持JPG、PNG格式，较好的效果为大图360*200，小图200*200
            Url	是	点击图文消息跳转链接
         */

        //模板
        /*
         *new
         * $news = array(
                 array(
                'title' => '爆炸新闻:中国要运营了',
                'desc' => '恩恩,是的',
                'picurl' => 'https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo/bd_logo1_31bdc765.png',
                'url' => 'https://www.baidu.com'),
        )
        */


        //处理数组
        $articleCount=0;
        $items = '';
        foreach ($items as $v) {
            $title = $v['title'];
            $desc = $v['desc'];
            $picurl = $v['picurl'];
            $url = $v['url'];
            $items .= sprintf($this->itemTemplate, $title, $desc, $picurl, $url);
            $articleCount++;
        }

        $responseImgText = sprintf($this->imgtextTemplate,
            $to,
            $from,
            time(),
            'news',
            $articleCount,
            $items
        );
        echo $responseImgText;
    }


    
    /************功能区*****************************************/


    /**
     * 清空定额
     * @param string $appid
     * @return bool|string 成功返回true,失败返回失败信息
     */
    public function clearQuota($appid)
    {
        //https://api.weixin.qq.com/cgi-bin/clear_quota?access_token=ACCESS_TOKEN
        $url="https://api.weixin.qq.com/cgi-bin/clear_quota?access_token=$this->_access_token";
        $postDate=array('appid'=>$appid);
        $resDate=$this->_curlPost($url,$postDate);
        if($resDate->errcode==0){
            return true;
        }
        if($resDate->errcode==48006){
            return $resDate->errmsg."--提示:清空次数已经用完";
        }
    }



    /*888888888888      辅助信息区      8888888888888888888888888888888*/

    

    /**
     * 辅:自动获取一个图片的mediaId
     */
    public function getAMediaId()
    {
        $imgs = array(
            '6Tp2I-1V4M0zU_bP-xkx2n9_xmCSns9rtrz-d2FvGEluLksCenUAcezw5ci8LNfh',
            'hw-6esOg4w1Xwgyi6oRNdN5kivaZzKYS2lNiWZT3G1uG1vw0ZmtfiMiwmDkcVyh3',
            'uoTWO9iZ9SAl18clQLu58HoYl80yeDS95Mx_NknDS-LV-lUZW9N4Z8kon8cQ1A1R'
        );
        $randNum = rand(0, 2);
        return $imgs[$randNum];
    }

    /**
     * 辅:自动获取news信息
     */
    public function getNews()
    {
       return array(
            'new1' => array(
                'title' => '爆炸新闻:中国要运营了',
                'desc' => '恩恩,是的',
                'picurl' => 'https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo/bd_logo1_31bdc765.png',
                'url' => 'https://www.baidu.com'),
            'new2' => array(
                'title' => '爆炸新闻:这是副标题',
                'desc' => '恩恩,是的',
                'picurl' => 'https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo/bd_logo1_31bdc765.png',
                'url' => 'https://www.baidu.com'),
            'new3' => array(
                'title' => '爆炸新闻:这是副标题',
                'desc' => '恩恩,是的',
                'picurl' => 'https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo/bd_logo1_31bdc765.png',
                'url' => 'https://www.baidu.com'),
            'new4' => array(
                'title' => '爆炸新闻:这是副标题',
                'desc' => '恩恩,是的',
                'picurl' => 'https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo/bd_logo1_31bdc765.png',
                'url' => 'https://www.baidu.com'),
            'new5' => array(
                'title' => '爆炸新闻:这是副标题',
                'desc' => '恩恩,是的',
                'picurl' => 'https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo/bd_logo1_31bdc765.png',
                'url' => 'https://www.baidu.com'),
            'new6' => array(
                'title' => '爆炸新闻:这是副标题',
                'desc' => '恩恩,是的',
                'picurl' => 'https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo/bd_logo1_31bdc765.png',
                'url' => 'https://www.baidu.com'),
            'new7' => array(
                'title' => '爆炸新闻:这是副标题',
                'desc' => '恩恩,是的',
                'picurl' => 'https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo/bd_logo1_31bdc765.png',
                'url' => 'https://www.baidu.com')
        );
    }
}

function d($date)
{
    echo "<pre>";
    print_r($date);

}